package com.dubbo.common.pwd;

import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

/**
 * base64工具类
 * @author chenwei
 * @date 2018年7月20日 下午10:09:40
 */
public final class Base64Util {
	private static final String UTF_8 = "UTF-8";
	
	/**
	 * base64编码
	 * <p>如果编码错误则返回null</p>
	 * 
	 * @author chenwei
	 * @date 2018年7月20日 下午10:14:24
	 * @param str
	 * @return
	 */
	public static String encoder(String str) {
		try {
			if(!StringUtils.isNotBlank(str)) {
				return null;
			}
			byte[] b = Base64.getEncoder().encode(str.getBytes(UTF_8));
			return new String(b,UTF_8);
		} catch (UnsupportedEncodingException e) {
			return null;
		}
	}
	
	
	/**
	 * base64编码 (参数byte[])
	 * @author lianglie
	 * @date 2019年2月22日 上午9:40:26
	 * @param by
	 * @return
	 */
	public static String encoderByte(byte[] by) {
		try {
			byte[] b = Base64.getEncoder().encode(by);
			return new String(b,UTF_8);
		} catch (UnsupportedEncodingException e) {
			return null;
		}
	}
	
	
	/**
	 * 重复编码,直到中间不包含'/'字符
	 * 
	 * @author chenwei
	 * @date 2019年1月23日 下午5:51:12
	 * @param str
	 * @return
	 */
	public static String encoders(String str) {
		try {
			if(!StringUtils.isNotBlank(str)) {
				return null;
			}
			byte[] b = Base64.getEncoder().encode(str.getBytes(UTF_8));
			str = new String(b,UTF_8);
			while(str.contains("/")) {
				b = Base64.getEncoder().encode(str.getBytes(UTF_8));
				str = new String(b,UTF_8);
			}
			return str;
		} catch (UnsupportedEncodingException e) {
			return null;
		}
	}
	/**
	 * base64解码
	 * <p>如果编码错误则返回null</p>
	 * 
	 * @author chenwei
	 * @date 2018年7月20日 下午10:18:23
	 * @param str
	 * @return
	 */
	public static String decode(String encoder) {
		try {
			if(!StringUtils.isNotBlank(encoder)) {
				return null;
			}
			byte[] decode = Base64.getDecoder().decode(encoder);
			return new String(decode,UTF_8);
		} catch (UnsupportedEncodingException e) {
			return null;
		}
	}
	/**
	 * 判断是否是base64编码
	 * 
	 * @author chenwei
	 * @date 2019年1月23日 下午5:38:29
	 * @param base64String
	 * @return
	 */
	public static boolean isBase64(String base64String) {
	    String base64Pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
	    return Pattern.matches(base64Pattern, base64String);
	}
	
	/**
	 * 多重解码
	 * 
	 * @author chenwei
	 * @date 2019年1月23日 下午5:44:04
	 * @param encoder
	 * @return
	 */
	public static String decodes(String encoder) {
		try {
			while(isBase64(encoder)) {
				byte[] decode = Base64.getDecoder().decode(encoder);
				encoder =  new String(decode,UTF_8);
			}
		} catch (Exception e) {
			return encoder;
		}
		return encoder;
	}
}
